/**
 * Created by Qingger Corp.
 * User: jsspf
 * Date: 2017/12/13
 * Time: 21:42
 */

/*
* 在普通的JS函数中，一旦函数开始执行，就会运行到结束，期刊不会有其它代码能够打断它并插入期间
* 而ES6引入了一个新的函数类型，它*并不符合这种从运行到结束的特性*，这种新的函数称为生成器(generator)
*
* ES6中指示暂停点的语法是yield，这表达了一种合作式的控制放弃
* Generator对象遵循迭代器接口( next , return , throw 函数)
*/

/// 1. 一个简单的示例
var x1 = 1;

/**
 * 生成器就是一类特殊的函数，可以一次或多次启动和停止，并不一定非得要完成。
 * 它将成为用于构建以生成器作为异步流程控制的代码模式的基础构件之一
 */
function *iterFoo() {
    x1++;
    // yield 允许一个 generator 函数暂停它的执行并且把控制权传递给外部系统
    yield 1;  // 暂停并返回null;
    console.log("x:",x1);
}

function iterBar() { x1++; }

debugger;
// 开始构造一个迭代器来控制函数的运行
let it = iterFoo() as Iterator<number>;  // it并不是函数返回的结果，而是迭代器类型对象
let i1 = it.next();
console.log(`1.it.next=${i1},x=${x1}`); // x={value:1,done:false}
iterBar();
let i2 = it.next();
console.log(`2.it.next=${i2},x=${x1}`); // x={value:1,done:true}


/**
 * 2. 输入和输出
 * 生成器函数是一个特殊的函数，具有前面我们展示的新的执行模式。
 * 生成器仍然是一个函数，这意味着它仍然有一些基本的特性没有改变
 */
function *iterFoo2(x:number,y:number) {
   return x*y;
}

let itf2 = iterFoo2(6,7);
let iterRes2 = itf2.next();  // iterRes2 = {value:42,done:true}
console.log(iterRes2.value);
console.log(iterRes2.done);
